﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;

namespace Algorithms_10.Tools
{
    /// <summary>
    /// Check of alle hoeken van de nummerplaat zo goed als rechte hoeken zijn
    /// </summary>
    /// <author>
    /// Erwin
    /// </author>
    class CornerChecker
    {
        private static Point tL, tR, bL, bR;

        /// <summary>
        /// Controleert of de hoeken in de afbeelding (ongeveer) rechte hoeken zijn.
        /// </summary>
        /// <param name="topLeft">De linker bovenhoek van het nummerbord</param>
        /// <param name="topRight">De rechter bovenhoek van het nummerbord</param>
        /// <param name="bottomLeft">De linker onderhoek van het nummerbord</param>
        /// <param name="bottomRight">De rechter onderhoek van het numnmerbord</param>
        /// <param name="threshold">Een percentage dat afgeweken mag worden bij de berekening van de rechte hoek (0 - 100)</param>
        /// <returns></returns>
        public static bool CheckCornersForDeformation(Point topLeft, Point topRight, Point bottomLeft, Point bottomRight, double percentageThreshold)
        {
            tL = topLeft;
            tR = topRight;
            bL = bottomLeft;
            bR = bottomRight;

            int horizontalPixelThreshold = (int)(((tR.X > bR.X ? tR.X : bR.X) - (tL.X < bL.X ? tL.X : bL.X)) * percentageThreshold / 100);
            int verticalPixelThreshold = (int)(((bL.Y > bR.Y ? bL.Y : bR.Y) - (tL.Y < tR.Y ? tL.Y : tR.Y)) * percentageThreshold / 100);

            bool isDeformed = false;

            //bovenkant
            if (tL.Y > tR.Y + verticalPixelThreshold || tL.Y < tR.Y - verticalPixelThreshold)
                isDeformed = true;
            //linker zijkant
            if (tL.X > bL.X + horizontalPixelThreshold || tL.X < bL.X - horizontalPixelThreshold)
                isDeformed = true;
            //rechter zijkant
            if (tR.X > bR.X + horizontalPixelThreshold || tR.X < bR.X - horizontalPixelThreshold)
                isDeformed = true;
            //onderkant
            if (bL.Y > bR.Y + verticalPixelThreshold || bL.Y < bR.Y - verticalPixelThreshold)
                isDeformed = true;
            return isDeformed;
        }

        /// <summary>
        /// Controleert of de hoeken in de afbeelding (ongeveer) rechte hoeken zijn.
        /// </summary>
        /// <param name="topLeft">De linker bovenhoek van het nummerbord</param>
        /// <param name="topRight">De rechter bovenhoek van het nummerbord</param>
        /// <param name="bottomLeft">De linker onderhoek van het nummerbord</param>
        /// <param name="bottomRight">De rechter onderhoek van het numnmerbord</param>
        /// <param name="percentageThreshold">De hoeveelheid pixels die afgeweken mogen worden bij de berekening van de rechte hoek</param>
        /// <returns></returns>
        public static bool CheckCornersForDeformation(Point topLeft, Point topRight, Point bottomLeft, Point bottomRight, int threshold)
        {
            tL = topLeft;
            tR = topRight;
            bL = bottomLeft;
            bR = bottomRight;

            bool isDeformed = false;

            //bovenkant
            if (tL.Y > tR.Y + threshold || tL.Y < tR.Y - threshold)
                isDeformed = true;
            //linker zijkant
            if (tL.X > bL.X + threshold || tL.X < bL.X - threshold)
                isDeformed = true;
            //rechter zijkant
            if (tR.X > bR.X + threshold || tR.X < bR.X - threshold)
                isDeformed = true;
            //onderkant
            if (bL.Y > bR.Y + threshold || bL.Y < bR.Y - threshold)
                isDeformed = true;
            return isDeformed;
        }
    }
}
